//
//  BitmapRGBA8Data.h
//  iOSUtils
//
//  Created by HJC on 11-9-16.
//  Copyright 2011年 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>


// 颜色结构, 各分量在0到255之间
typedef struct
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
} RGBAColor;



static RGBAColor RGBAColorMake(unsigned char red,
                               unsigned char green, 
                               unsigned char blue, 
                               unsigned char alpha)
{
    RGBAColor color = { red, green, blue, alpha };
    return color;
}


///////////////
typedef union
{
    RGBAColor       color;
    unsigned int    uint;
} RGBAColorUnion;



// 颜色结构和整数之间的转换
inline static unsigned int UintFromRGBAColor(RGBAColor color)
{
    RGBAColorUnion u;
    u.color = color;
    return u.uint;
}

inline static RGBAColor RGBAColorFromUint(unsigned int uint)
{
    RGBAColorUnion u;
    u.uint = uint;
    return u.color;
}


//////////////////////////////////////////////////////////
// 颜色矩阵(不懂google一下), 用于将一种颜色，转换成另一种颜色，　
typedef struct
{
    CGFloat m11, m12, m13, m14, m15;
    CGFloat m21, m22, m23, m24, m25;
    CGFloat m31, m32, m33, m34, m35;
    CGFloat m41, m42, m43, m44, m45;
} RGBAColorMatrix;


// 使用颜色矩阵来处理颜色
extern RGBAColor ColorMatrix_ProcessColor(RGBAColorMatrix* matrix, RGBAColor color);

// 用bitmap数据创建一个绘图环境，之后就可以用CGContextRef来绘画
// 注意要使用CGContextRelease来释放
extern CGContextRef NewBitmapRGBA8Context(void* bytes, size_t width, size_t height);

// 处理颜色的回调，将一种颜色转成另一种颜色
typedef RGBAColor (*ColorProcessCallBack)(void* context, RGBAColor color);



////////////////////////////////
// 可以使用此类，将UIImage转成bitmap数据点，之后就可以直接操作颜色数据
@interface BitmapRGBA8Data : NSObject 
{
@private
    unsigned int*       _pixels;
    NSInteger           _width;
    NSInteger           _height;
}
@property (nonatomic, readonly) unsigned int*   pixels; // 原始的数据点
@property (nonatomic, readonly) NSInteger       width;
@property (nonatomic, readonly) NSInteger       height;

- (id)  initWithCGImage:(CGImageRef)imageRef;
- (id)  initWithBitmapData:(BitmapRGBA8Data*)data;
- (id)  initWithWidth:(NSInteger)width height:(NSInteger)height;

// 转成图片，copyData表示是否需要复制一份数据点
// 有时候并不需要复制数据点的，比如转成图片用于绘画
- (UIImage*) convertToImageCopyData:(BOOL)copyData;

// 取得对应位置的颜色值
- (RGBAColor) colorAtPosX:(NSInteger)x posY:(NSInteger)posY;

// 清除颜色
- (void)      clearWithColor:(RGBAColor)color;

// 使用颜色矩阵或者自定义的函数来改变颜色数据
- (void) processWithColorMatrix:(RGBAColorMatrix*)colorMatrix;
- (void) processWithCallBack:(ColorProcessCallBack)callBack context:(void*)context;

@end
